package cn.itrip.auth.service;

import cn.itrip.auth.vo.PhoneApi;
import cn.itrip.beans.dtos.Dto;
import cn.itrip.beans.pojo.User;
import cn.itrip.common.DtoUtil;
import cn.itrip.mapper.UserMapper;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class UserServiceImlp implements UserService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private JavaMailSender javaMailSender;
    @Resource
    private SimpleMailMessage mailMessage;
    @Resource
    private PhoneApi phoneApi;
    @Override
    public Dto isExists(String name) {
        User user=new User();
        user.setUserCode(name);
        boolean b= userMapper.selectCount(user)==0;
        if(!b){
            return DtoUtil.getFalseDto("已经存在此用户","10002");
        }
        return DtoUtil.getSuccessDto("可以注册");
    }

    @Override
    public Dto regedit(User user) throws MessagingException {
        // 1 先添加 未激活状态
        user.setCreationdate(new Date());
        user.setModifydate(new Date());
        //密码需要加密
        if (!(userMapper.insert(user)>0)) {
            return DtoUtil.getFalseDto("添加失败，联系管理员","10001");
        }
        //2 生成验证码  UID 3000年  32  48 36
        String code= UUID.randomUUID().toString();
        //3 保存验证码到redis
        stringRedisTemplate.opsForValue().set(user.getUserCode(),code,1*60*24, TimeUnit.MINUTES);
        //4 发送邮件
        mailMessage.setText("欢迎注册我们网站，您 的验证码是"+code+"一天内有效，尽快激活");
        mailMessage.setTo(user.getUserCode());
        javaMailSender.send(mailMessage);
        return DtoUtil.getSuccessDto("消息发送成功");
    }

    @Override
    public Dto activeUser(String user, String code) {
        //1 看是不是有这个用户
        if (!stringRedisTemplate.hasKey(user)) {

            return DtoUtil.getFalseDto("用户不存在或者已经激活","100003");
        }
        if(StringUtils.isEmpty(code)) {
            return DtoUtil.getFalseDto("验证码不为空","100004");
        }
        //2 看验证码是否一致
        if (!stringRedisTemplate.opsForValue().get(user).equals(code)) {
            return DtoUtil.getFalseDto("验证码不匹配","100005");
        }
        User user2=new User();
        user2.setUserCode(user);
        user2=userMapper.selectOne(user2);
        user2.setActivated(1);
        //3  修改用户的状态为激活
        userMapper.updateByPrimaryKey(user2);
        //4  删除掉redis 的code
        stringRedisTemplate.delete(user);
        //5  给用户响应
        return DtoUtil.getSuccessDto("激活成功");
    }

    @Override
    public Dto regeditByphone(User user) {
        // 1 先添加 未激活状态
        user.setCreationdate(new Date());
        user.setModifydate(new Date());
        user.setActivated(0);
        //密码需要加密
        if (!(userMapper.insert(user)>0)) {
            return DtoUtil.getFalseDto("添加失败，联系管理员","10001");
        }
        //2 生成验证码  UID 3000年  32  48 36   4 位随机数
        Random random=new Random();
        String code= random.nextInt(10)+""+random.nextInt(10)+random.nextInt(10)+random.nextInt(10);
        //3 保存验证码到redis
        stringRedisTemplate.opsForValue().set(user.getUserCode(),code,1, TimeUnit.MINUTES);
        //4 发送短信
        phoneApi.sendTemplateSMS(user.getUserCode(),"1" ,new String[]{code,1+""});

        return DtoUtil.getSuccessDto("消息发送成功");
    }
}
